package main

import "fmt"

func main() {
   n := 18
   // 取地址
   fmt.Println(&n)
   fmt.Println(*&n)

   p := &n
   // 根据地址取值
   fmt.Printf("%T\n", p) // 打印结果是*int，即int类型的指针
   m := *p
   fmt.Println(m) //根据地址取值

   var a1 *int     //nil pointer
   fmt.Println(a1) //<nil>

   var a2 = new(int)  // 分配内存空间
   fmt.Println(a2)  //内存地址 0xc000108010
   fmt.Println(*a2) //0 根据内存地址取值 没有值返回0

   *a2 = 100        //根据内存地址赋值
   fmt.Println(*a2) //100

   var age int
   fmt.Scanf("%d", &age) //输入age的值

   switch {
   case age < 18:
      fmt.Println("好好学习Z")
   case age > 18 && age < 60:
      fmt.Println("好好上班")
   case age > 60:
      fmt.Println("希望不用继续上班了，哈哈")
   default:
      fmt.Println(age)
   }

   fmt.Println("~~~~~~~~~~~~")

   //  在一个 switch 块内，每个 case 无需声明 break 来终止 
   //  如果想顺序执行使用 fallthrough 
   //  在一个switch块内，都必须包含一个 default 语句并且放在最后
   //  即使它什么代码也没有

   switch {
   case false:
           fmt.Println("false1")
           fallthrough
   case true:
           fmt.Println("true1")
           fallthrough
   case false:
           fmt.Println("false2")
           fallthrough
   case true:
           fmt.Println("true2")
   case false:
           fmt.Println("false3")
           fallthrough
   default:
           fmt.Println("default case")
   }

}